package com.ck.core.ffmpeg;

import java.util.ArrayList;
import java.util.List;

/**
 * 命令生产工具
 *
 * @author linqiang
 * @version v1.0
 * @Description
 * @date 2019-04-18 15:42
 */
public class FfmpegCommandBuilder {
    private List<String> command = new ArrayList<String>();

    public FfmpegCommandBuilder(String exePath) {
        if (exePath == null) {
            throw new NullPointerException("ffmpeg.exe 路径不得为空");
        }
        //添加命令的exe执行文件位置
        command.add(exePath);
    }

    /**
     * 添加输入文件的路径
     *
     * @param inputFilePath
     */
    public FfmpegCommandBuilder input(String inputFilePath) {
        if (inputFilePath != null) {
            command.add("-i");
            command.add(inputFilePath);
        }
        return this;
    }

    /**
     * 添加输出文件的路径
     *
     * @param outputFilePath
     */
    public FfmpegCommandBuilder output(String outputFilePath) {
        if (outputFilePath != null) {
            command.add(outputFilePath);
        }
        return this;
    }


    /**
     * 设置音量 (负数为降低音量， 整数位增加音量)
     * 如：ffmpeg -i cw.avi -af volume=-20dB cw_m20db.avi 降低20db
     * 如：ffmpeg -i cw.avi -af volume=20dB cw_m20db.avi 增加20db
     */
    public FfmpegCommandBuilder volume(Float volume) {
        command.add("-af");
        command.add("volume=" + volume + "dB");
        return this;
    }

    /**
     * 设置音量 (获取声音信息)
     * 如：ffmpeg -i cw.avi -af volume=-20dB cw_m20db.avi 降低20db
     * 如：ffmpeg -i cw.avi -af volume=20dB cw_m20db.avi 增加20db
     */
    public FfmpegCommandBuilder volumeDetect() {
        command.add("-af");
        command.add("volumedetect");
        command.add("-f");
        command.add("null");
        command.add("/dev/null");
        return this;
    }

    /**
     * 覆盖输出文件
     */
    public FfmpegCommandBuilder override() {
        command.add("-y");
        return this;
    }

    /**
     * 质量为基础的VBR，取值0.01-255，约小质量越好
     *
     * @return
     */
    public FfmpegCommandBuilder qscale(String qscale) {
        command.add("-qscale");
        command.add(qscale);
        return this;
    }

    /**
     * 视频编解码
     *
     * @return
     */
    public FfmpegCommandBuilder vcodec(String xvid) {
        command.add("-vcodec");
        command.add(xvid);
        return this;
    }

    /**
     * 视频质量<数值> 设定最大质量，与-qmin（设定最小质量）共用，比如-qmin 10 -qmax 31
     *
     * @return
     */
    public FfmpegCommandBuilder threads(String threadNum) {
        command.add("-threads");
        command.add(threadNum);
        return this;
    }

    /**
     * 视频码率设置 如 -vb 6655000
     */
    public FfmpegCommandBuilder vb(Integer vb){
        command.add("-vb");
        command.add(""+vb);
        return this;
    }

    /**
     * 音频码率设置 如 -ab 63000
     */
    public FfmpegCommandBuilder ab(Integer ab){
        command.add("-ab");
        command.add(""+ab);
        return this;
    }

    /**
     * 音频编解码
     *
     * @return
     */
    public FfmpegCommandBuilder acodec(String pcm) {
        command.add("-acodec");
        command.add(pcm);
        return this;
    }

    /**
     * 创建FFmpegCommand命令封装类
     *
     * @return FFmpegCommand
     */
    public FfmpegCommand build() {
        return new FfmpegCommand(command);
    }

    /**
     * 创建FFmpegCommand命令封装类
     *
     * @return FFmpegCommand
     */
    public void clear() {
        command.clear();
    }

}
